package ce.com.cenewbluesdk.entity.k3;

import android.util.Log;



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import ce.com.cenewbluesdk.CEBC;
import ce.com.cenewbluesdk.entity.BaseData;
import ce.com.cenewbluesdk.entity.CEDevData;
import ce.com.cenewbluesdk.uitl.ByteUtil;

/**
 * Created by Administrator on 2015/7/3.
 * typedef struct
 * {
 * unsigned char abs_time[4];    //信息到来时的绝对时间
 * unsigned char type;		//信息的类型，1：电话；2：短信，3：邮件；4：QQ;
 * //5：微信；6：facebook；7：twitter
 * unsigned char info_items;	//属性条目数
 * info_struct info;     //属性条目信息
 * ......
 * }message_notice_struct;
 * <p/>
 * typedef struct
 * {
 * unsigned char attribute;    //属性类型，0：号码类型，1：名字类型，
 * //2：信息内容类型；
 * unsigned char len;		  //属性内容的长度
 * unsigned char data[len];   //具体内容，len为长度值；
 * }info_struct;
 */
public class Message_notice_struct_K3  extends BaseData implements Serializable {

    public static final byte TYPE_PHONE = 1;
    public static final byte TYPE_MSG = 2;
    public static final byte TYPE_EMAIL = 5;
    public static final byte TYPE_QQ = 3;
    public static final byte TYPE_WX = 4;
    public static final byte TYPE_FACEBOOK = 6;
    public static final byte TYPE_TWITTER = 7;
    public static final byte TYPE_WHATSAPP = 8;
    public static final byte TYPE_OTHER = 9;

    // 信息到来时的绝对时间
    private byte[] abs_time = new byte[4];
    // 信息的类型，1：电话；2：短信，3：邮件；4：QQ;
    private byte type;
    //属性条目信息
    private List<Property> infos = new ArrayList<Property>();

    /**
     * @param time 时间戳 毫秒
     * @param type
     */
    public Message_notice_struct_K3(long time, byte type) {
        super();
        this.abs_time = ByteUtil.intToByte((int) (time / 1000));
        this.type = (byte) type;
    }

    /**
     * 第一个参数是发送消息人的名字
     * 第二个参数是消息的内容   0：号码类型，1：名字类型，2：信息内容类型；
     * 第三个参数是内容
     * @param name
     * @param contextType
     * @param contexts
     */
    public void setSendContext(String  name,byte contextType,String contexts){
        addProperty(Message_notice_struct_K3.Property.TYPE_NAME, name);
        addProperty(contextType, contexts);

    }

    private void addProperty(byte proType, String content) {
        Property p = new Property();
        byte[] data = content.getBytes();
        Property nameP=null;
            for(int i=0;i<infos.size();i++){       // 循环这个message中的实体
                if(infos.get(i).getAttribute()== Property.TYPE_NAME){//判断是否是有名字（这里一点是要名字先添加，名字长度不做处理）
                    nameP=infos.get(i);
                }
            }

        int namepL=0;//名字锁占字节数
        if(nameP!=null){
            namepL=nameP.getBytes().length;
        }

        boolean needAddPoint=false;

        int len=0;
        if(proType== Property.TYPE_NAME){
            len=200;
        }else{
            len=240;
        }

        while (content.getBytes().length>len-namepL-2 -6){//对数据进行截取，240 是一个数据包最大发送数据数， 2是发送数据是描述内容长度和内容类型所需要的字节数
            // 减6是因为 在message。getbytes 时要4个自己放时间   要1个字节放长度，1个字节放消息的类型
            content=content.substring(0, content.length() - 1);
            needAddPoint=true;
        }

        if(needAddPoint){//  因为设备那边不知道内容具体发送多少个字节，所以我们自己加点
            content=content.substring(0,content.length()-3)+"...";
        }
        data=content.getBytes();
        p.data = data;

        p.len = (byte) data.length;
        p.attribute = proType;
        infos.add(p);
    }

    public byte[] getBytes() {
        int len = 0;
        for (Property p : infos) {
            Log.d("liu","p.getBytes().length="+p.getBytes().length);
            len += (p.getBytes().length);
        }
        Log.d("liu","abs_time.length="+abs_time.length+"   len="+len);
        byte[] bytes = new byte[abs_time.length + 2 + len];
        System.arraycopy(abs_time, 0, bytes, 0, abs_time.length);
        bytes[abs_time.length] = type;
        bytes[abs_time.length + 1] = (byte) infos.size();
        int index = 6;
        for (Property p : infos) {
            System.arraycopy(p.getBytes(), 0, bytes, index, p.getBytes().length);
            index += p.getBytes().length;
        }
        return bytes;
    }
    @Override
    public CEDevData toCEDevData() {
        CEDevData data=new CEDevData();
        data.setCmd(CEBC.CMD_SEND_TYPE);
        data.setDataType(CEBC.K3.DATA_TYPE_MESSAGE_NOTICE);
        byte [] bytes =getBytes();
        data.setData(bytes);
        data.setItemL(bytes.length);
        data.setItemNumber(1);
        return data;
    }

    //Object src, int srcPos,
//    Object dst, int dstPos, int length

    public class Property implements Serializable {

        public static final byte TYPE_PHONE_NUM = 0;
        public static final byte TYPE_NAME = 1;
        public static final byte TYPE_CONTENT = 2;
        byte attribute;    //属性类型，0：号码类型，1：名字类型，
        //2：信息内容类型；
        byte len;          //属性内容的长度
        byte[] data;   //具体内容，len为长度值；

        public byte[] getBytes() {
            byte[] bytes = new byte[2 + data.length];
            bytes[0] = attribute;
            bytes[1] = len;
            System.arraycopy(data, 0, bytes, 2, data.length);
            return bytes;
        }

        public byte getAttribute() {
            return attribute;
        }
    }
}
